home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / bluepin < prev    next >
Text File  |  2006-05-15  |  3KB  |  165 lines

  1. #!/usr/bin/python
  2. #
  3. # Bluetooth PIN helper
  4. # Written by Maxim Krasnyansky <maxk@qualcomm.com>
  5. #
  6. import sys, os, string, popen2, pygtk
  7.  
  8. pygtk.require('2.0')
  9.  
  10. # X Display initialization.
  11. # Find running X Server and parse its arguments.
  12. # Set environment variables DISPLAY and XAUTHORITY
  13. # using info extracted from X Server args.
  14. #
  15. def set_display():
  16.     disp = ":0"
  17.     auth = ""
  18.     proc = "-C X -C Xorg -C XFree86"
  19.     ps   = "/bin/ps " + proc + " --format args --no-headers"
  20.  
  21.     r,w = popen2.popen2(ps)
  22.     arg = string.split(r.read())
  23.     for i in range(1, len(arg)):
  24.         if arg[i][0] != '-' and i==1:
  25.             disp = arg[i]
  26.         elif arg[i] == "-auth":
  27.             auth = arg[i+1]
  28.             break
  29.  
  30.     os.environ['DISPLAY']    = disp 
  31.     os.environ['XAUTHORITY'] = auth
  32.  
  33. # Set X display before initializing GTK
  34. #set_display()
  35.  
  36. # Some versions of fontconfig will segfault if HOME isn't set.
  37. #os.environ['HOME'] = ""
  38.  
  39. import gtk
  40.  
  41. # Dialog Class
  42. DLG_OK = 1
  43. DLG_CANCEL = 2
  44. class Dialog(gtk.Dialog):
  45.     result = DLG_CANCEL 
  46.     args = {}
  47.     def __init__(self, modal=gtk.FALSE, mesg=None, args = {}):
  48.         gtk.Dialog.__init__(self)
  49.         self.args = args
  50.         self.set_modal(modal)
  51. #        self.set_usize(400, 0)
  52. #        self.set_uposition(300,300)
  53.         
  54.         self.connect("destroy", self.quit)
  55.         self.connect("delete_event", self.quit)
  56.  
  57.         self.action_area.set_border_width(2)
  58.  
  59.         ok = gtk.Button("Accept")
  60.         ok.connect("clicked", self.ok)
  61.         self.action_area.pack_start(ok, padding = 20)
  62.         ok.show()
  63.  
  64.         cl = gtk.Button("Reject")
  65.         cl.connect("clicked", self.cancel)
  66.         self.action_area.pack_start(cl, padding = 20)
  67.         cl.show()
  68.  
  69.         if mesg:
  70.             msg = gtk.Label("")
  71.             msg.set_text(mesg)
  72.             self.vbox.pack_start(msg, padding = 10)
  73.             msg.show()
  74.  
  75.         self.ents = []
  76.         for k in self.args.keys():
  77.             hbox = gtk.HBox()
  78.             hbox.set_border_width(5)
  79.             self.vbox.pack_start(hbox)
  80.             hbox.show()
  81.  
  82.             l = gtk.Label("")
  83.             e = gtk.Entry()
  84.             l.set_text( k )
  85.             e.set_text( self.args[k] )
  86.             e.connect("key_press_event", self.key_press)
  87.             hbox.pack_start(l, padding = 10, expand = gtk.FALSE)
  88.             hbox.pack_start(e)
  89.             l.show()
  90.             e.show()
  91.  
  92.             self.ents.append( (k, e) )
  93.  
  94.         self.ents[0][1].grab_focus()
  95.  
  96.     def key_press(self, entry, event):
  97.         if event.keyval == gtk.keysyms.Return:
  98.             entry.emit_stop_by_name("key_press_event")
  99.             self.ok()
  100.         elif event.keyval == gtk.keysyms.Escape:
  101.             entry.emit_stop_by_name("key_press_event")
  102.             self.cancel()
  103.  
  104.     def ok(self, *args):
  105.         self.result = DLG_OK 
  106.         for e in self.ents:
  107.             k = e[0]
  108.             self.args[k] = e[1].get_text() 
  109.         self.quit()
  110.  
  111.     def cancel(self, *args):
  112.         self.result = DLG_CANCEL 
  113.         self.quit()
  114.  
  115.     def quit(self, *args):
  116.         self.hide()
  117.         self.destroy()
  118.         gtk.mainquit()
  119.  
  120. def dialog(title, mesg, args, modal = gtk.FALSE):
  121.     dlg = Dialog(args = args, mesg = mesg, modal = modal)
  122.     dlg.set_title(title)
  123.     dlg.show()
  124.     gtk.mainloop()
  125.     return dlg.result
  126.  
  127. def main(*args):
  128.     if len(sys.argv) < 2:
  129.         print "ERR"
  130.         sys.exit()
  131.     
  132.     dir    = sys.argv[1]
  133.     bdaddr = sys.argv[2]
  134.  
  135.     if len(sys.argv) > 3:
  136.         name = sys.argv[3]
  137.     else:
  138.         name = ""
  139.  
  140.     title = "Bluetooth PIN Code"
  141.  
  142.     # Bluetooth spec recommends automatic strong random PIN generation.
  143.     # So eventually we should implement that. 
  144.     pin = { "PIN": "" }
  145.  
  146.     if dir == "out":
  147.         mesg = "Outgoing connection to "
  148.     else:
  149.         mesg = "Incoming connection from "
  150.     
  151.     mesg = mesg + name + "[" + bdaddr + "]"
  152.  
  153.     if dialog(title, mesg, pin) == DLG_OK:
  154.         pin["PIN"] = string.strip(pin["PIN"])
  155.  
  156.         if len(pin["PIN"]) >= 1 and len(pin["PIN"]) <= 16:
  157.             print "PIN:" + pin["PIN"]
  158.         else:
  159.             print "ERR"
  160.     else:
  161.         print "ERR"
  162.  
  163. #
  164. main()
  165.